package fr.afcepf.atod16.groupe1.projet2.serviceCommande;

import fr.afcepf.atod16.groupe1.projet2.dto.DtoCommande;
import fr.afcepf.atod16.groupe1.projet2.exception.ActivationException;
import fr.afcepf.atod16.groupe1.projet2.exception.EtatLivraisonException;
import fr.afcepf.atod16.groupe1.projet2.exception.InvalidArgumentException;
import fr.afcepf.atod16.groupe1.projet2.exception.NotExistException;
import fr.afcepf.atod16.groupe1.projet2.exception.StockException;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlElement;

/**
 * Interface webservice du service métier de gestion des commandes
 * @author cedric
 */
@WebService
public interface ServiceCommandeStockWebservice {
    /**
     * Crée une commande en base avec ses lignes.
     * @param commande Le DTO contenant les informations
     * @return True si la création a réussie, False sinon
     * @throws InvalidArgumentException Si un code EAN13 est mal formé ou si une quantité est illogique
     * @throws NotExistException Si un code EAN13 ne correspond pas à un produit
     * @throws ActivationException Si un code EAN13 correspond à un produit desactivé
     * @throws StockException Si un produit n'est pas en stock suffisant
     */
    @WebMethod(operationName="creerCommande")
    public boolean creerCommande(@WebParam(name="commande")
                                 @XmlElement(required=true)
                                 DtoCommande commande) throws InvalidArgumentException, NotExistException, ActivationException, StockException;
    
    /**
     * Bloque une commande en EtatLivraison.BLOQUE
     * @param idSite L'identifiant de la commande sur le site
     * @return True si la annulation a réussie, False sinon
     * @throws InvalidArgumentException Si l'identifiant de la commande est illogique
     * @throws NotExistException Si il n'y a pas de commande correspondante à l'identifiant fourni
     * @throws EtatLivraisonException Si la commande ne peut plus être bloque (si déja bloquée, livrée ou expédiée)
     */
    @WebMethod(operationName="annulerCommande")
    public boolean annulerCommande(@WebParam(name="idSite")
                                   @XmlElement(required=true)
                                   Integer idSite) throws InvalidArgumentException, NotExistException, EtatLivraisonException;
}
